#pragma once

// CORE_ARR_TYPE_TMP_BASE: 核心数组取分类数组索引的基址
// +3 +2
/*
48 8B F1 8B 0D ?? ?? ?? ?? 41 BF 84 62 00 00 48 C1 EE 36 48 8B 2C C8 41 38 3C 2F
*/
constexpr auto SIGN_CORE_ARR_TMP_INDEX_BASE =
    "48 8B F1 8B 0D ?? ?? ?? ?? 41 BF 84 62 00 00 48 C1 EE 36 48 8B 2C C8 41 "
    "38 3C 2F";

// player_id_base: id_ptr = r8(base)+10
// +0 +3
constexpr auto SIGN_PLAYER_ID_BASE =
    "48 8B 05 ?? ?? ?? ?? 48 85 C0 74 ?? 48 83 C0 10";

// get_object_index_base
// -1B +3
constexpr auto SIGN_GET_OBJECT_INDEX_BASE =
    "48 8B 43 40 48 8D 14 40 48 8B 43 48 48 8B 5C 24 28 4C 8D 04 D0 49 3B D8";

// 角色名称基址
// std::string name = (char*)base;
// +2 +3
constexpr auto SIGN_PLAYER_NAME_BASE =
    "33 FF 48 8D 05 ?? ?? ?? ?? 40 38 3D ?? ?? ?? ?? 48 0F 45 F8 48 8B C7";

// 背包对象id指针基址
// container_id_ptr=base+index*10
// index: [0-3]
// +3 +3
constexpr auto SIGN_CONTAINER_ID_BASE =
    "48 8B C3 48 8D 0D ?? ?? ?? ?? 48 C1 E0 04 48 03 C1 48 83 C4";

// item_prop 数组基址
// +D +3
constexpr auto SIGN_ITEM_PROP_BASE =
    "8B 11 4C 8D 4C 24 50 48 8B F9 45 33 C0 48 8D 0D";

// 物品分类数组基址
// +D +3
constexpr auto SIGN_ITEM_TYPE_ARR_BASE =
    "41 8B 17 4C 8D 8D 90 00 00 00 45 33 C0";

// 类型名称基址 call内基址
// +31 +1 +5 +3
constexpr auto SIGN_ITEM_TYPE_NAME_BASE =
    "88 47 10 48 8D 4C 24 40 0F B7 86 7E 01 00 00 89 47 14";

// 获取物品子类型ptr call
// -5 -1
constexpr auto SIGN_ITEM_SUBTYPE_CALL =
    "48 8B D8 48 85 C0 74 ?? 48 63 40 04 85 C0 74 ?? 48 8B C8 44 38 6C 03 04";

// get_time_base
// -5 +1 +0 +2
constexpr auto SIGN_GET_TIME_BASE = "0F 57 C9 8B C0 48 8B CF";

// SpellName base
// +A +3
// GetSpellName call
// +11 +1
constexpr auto SIGN_SPELL_NAME_BASE = "4C 8D 4D 80 45 33 C0 41 8B D4";

// spell id base
// -5 +1 +29 +3
constexpr auto SING_SPELL_ID_BASE = "45 0F B6 C5 8B D3 48 8B C8";

// GetSpellCooldown call
// +1C +1
constexpr auto SIGN_SPELL_COOLDOWN_CALL = "48 89 44 24 ?? 89 5C 24 ?? 89 5C 24";

// common send call
// call 内定位 +0
constexpr auto SIGN_COMMON_SEND_CALL =
    "48 8B D1 48 8B 0D ?? ?? ?? ?? 48 85 C9 74 ?? 41 B0 02";

// click call
// +8 +1
constexpr auto SIGN_CLICK_CALL = "F2 0F 11 45 D0 89 7D DC";

// macro call
// -35 +1
// macro base
// -3C +3
constexpr auto SIGN_MACRO = "8B C8 48 2B CF 8B C3 48 3B C8";

// select call 选择 unit 或 地面物品, 不能选自己和背包物品
// +B +1
constexpr auto SIGN_SELECT_CALL = "48 8D 4D A0 89 7D B0 0F 11 4D A0";

// SendMail call 内基址
// -11 +1 +2 +3
constexpr auto SIGN_SEND_MAIL_RCX_BASE =
    "48 C7 C3 FF FF FF FF 48 8B FB 0F 10 00";

// equip rcx base
// call 内基址
// +D +1 +2 +3
// 这个基址 +20 就是主背包 equip 时的 rcx 基址
constexpr auto SIGN_EQUIP_RCX_BASE = "48 8B 0B 48 39 4F 20";

// sell rcx base
// call 内基址
// -5 +1 +0 +3
constexpr auto SIGN_SELL_RCX_BASE = "0F 10 45 00 48 8D 4C 24 40";

// destroy rcx base
// call 内基址
// -5 +1 +0 +3
constexpr auto SIGN_DESTROY_RCX_BASE = "48 8B 44 24 78 40 88 ?? 04";

// TaxiNodeArrBase
// +8 +3
// TaxiNodeIdArrBase
// -7 +3
// node arr size 基址是 TaxiNodeIdArrBase - 0x30
// GetTaxiNodeName call
// +F +1
constexpr auto SIGN_TAXI_NODE_ARR_BASE = "4C 8D 4C 24 38 8B 14 C8";

// take taxi call
// +F +1
constexpr auto SIGN_TAKE_TAXI_CALL =
    "48 8B CB E8 ?? ?? ?? ?? F2 48 0F 2C C8 FF C9 E8 ?? ?? ?? ?? 33 C0";
